//字节序操作函数（大端/小端）

#ifndef __endian_H__
#define __endian_H__

#include <byteswap.h>
#include <stdint.h>
#include <type_traits>

// const int FRAMEWORK_LITTLE_ENDIAN = 1; //小端
// const int FRAMEWORK_BIG_ENDIAN = 2;    //大端


namespace framework
{

//8字节类型的字节序转化
template<class T>
typename std::enable_if<sizeof(T) == sizeof(uint64_t), T>::type
byteswap(T value)
{
    //bswap_64: 它的作用是将一个64位整数的高字节和低字节互换
    return (T)bswap_64((uint64_t)value);
}   

//4字节类型的字节序转化
template<class T>
typename std::enable_if<sizeof(T) == sizeof(uint32_t), T>::type
byteswap(T value)
{
    return (T)bswap_32((uint32_t)value);
}   

//2字节类型的字节序转化
template<class T>
typename std::enable_if<sizeof(T) == sizeof(uint16_t), T>::type
byteswap(T value)
{
    return (T)bswap_16((uint16_t)value);
}  

//*************************************************************************
//如果当前是大端的机器
#if BYTE_ORDER == BIG_ENDIAN
// #define FRAMEWORK_BYTE_ORDER FRAMEWORK_BIG_ENDIAN //将FRAMEWORK_BYTE_ORDER设置为大端

//只在小端机器上执行byteswap, 在大端机器上什么都不做
template<class T>
T byteswapOnLittleEndian(T t) {
    return t;
}

//只在大端机器上执行byteswap, 在小端机器上什么都不做
template<class T>
T byteswapOnBigEndian(T t) {
    return byteswap(t);
}

#else  //如果当前是小端的机器
// #define FRAMEWORK_BYTE_ORDER FRAMEWORK_LITTLE_ENDIAN //将FRAMEWORK_BYTE_ORDER设置为小端

//只在大端机器上执行byteswap, 在小端机器上什么都不做
template<class T>
T byteswapOnBigEndian(T t)
{
    return t;
}

//只在小端机器上执行byteswap, 在大端机器上什么都不做
template<class T>
T byteswapOnLittleEndian(T t)
{
    return byteswap(t);
}

#endif
//*************************************************************************


} // namespace framework




#endif
